#ifndef XMLINFOAGENCE_HPP
#define XMLINFOAGENCE_HPP

#include "XmlInfoNom.hpp"

#include <QtCore/QHash>

/** Classe qui implémente une agence.
  * Ces informations sont affichées sur la page de profile de l'agence.
  *
  * @author Johan "Solo" Luisier
  * @date Novembre 2011
  */
class XmlInfoAgence : public XmlInfoNom
{
public:
    /** Constructeur
      *
      *
      * @param[in] nomFichier nom du fichier XML.
      * @param[in] id identifiant de l'agence.
      * @param[in] nom nom de l'agence
      * @param[in] nbrJours nbr de jours d'existence de l'agence.
      * @param[in] niveau niveau d'accréditation de l'agence.
      * @param[in] score score réalisé par l'agence.
      * @param[in] reputation score de réputation de l'agence.
      * @param[in] nbrPortails nbr de portails construits.
      * @param[in] nbrVilles nbr de villes contrôlées.
      * @param[in] nbrMonstres nbr de monstres employés.
      * @param[in] nbrMaxMonstres nbr maximal de monstres.
      * @param[in] nbrEffrayes nbr d'enfants effrayés.
      * @param[in] nbrDevores nbr d'enfants dévorés.
      * @param[in] nbrAbordables nbr de contrats abordables effectués.
      * @param[in] nbrAbordablesRates nbr de contrats abordables ratés.
      * @param[in] nbrNormaux nbr de contrats normaux effectués.
      * @param[in] nbrNormauxRates nbr de contrats normaux ratés.
      * @param[in] nbrDifficiles nbr de contrats difficiles effectués.
      * @param[in] nbrDifficilesRates nbr de contrats difficiles ratés.
      * @param[in] nbrMonstrueux nbr de contrats monstrueux effectués.
      * @param[in] nbrMonstrueuxRates nbr de contrats monstrueux ratés.
      * @param[in] nbrInfernaux nbr de contrats infernaux effectués.
      * @param[in] nbrInfernauxRates nbr de contrats infernaux ratés.
      * @param[in] idSyndicat identification du syndicat.
      * @param[in] syndicat nom du syndicat.
      * @param[in] nbrMonstreCredits nbr de monstercrédits.
      * @param[in] nbrMailsNonLus nbr de mails non-lus.
      * @param[in] emplacementBoite ville sur laquelle se trouve la boîte à pet.
      * @param[in] niveauBoite niveau de la boîte à pet (en \f$m^3\f$).
      */
    XmlInfoAgence( const QString& nomFichier, const unsigned& id,
                   const QString& nom, const unsigned& nbrJours,
                   const unsigned& niveau, const unsigned& score,
                   const unsigned& reputation, const unsigned& nbrPortails,
                   const unsigned& nbrVilles, const unsigned& nbrMonstres,
                   const unsigned& nbrMaxMonstres, const unsigned& nbrEffrayes,
                   const unsigned& nbrDevores, const unsigned& nbrAbordables,
                   const unsigned& nbrAbordablesRates, const unsigned& nbrNormaux,
                   const unsigned& nbrNormauxRates, const unsigned& nbrDifficiles,
                   const unsigned& nbrDifficilesRates,
                   const unsigned& nbrMonstrueux,
                   const unsigned& nbrMonstrueuxRates,
                   const unsigned& nbrInfernaux,
                   const unsigned& nbrInfernauxRates,
                   const unsigned& idSyndicat, const QString& syndicat,
                   const unsigned& nbrMonstreCredits,
                   const unsigned& nbrMailsNonLus,
                   const QString& emplacementBoite, const double& niveauBoite );
    /** Constructeur de copie, permet de dupliquer une instance.
      *
      * @param[in] agence instance de %XmlInfoAgence à copier.
      */
    XmlInfoAgence( const XmlInfoAgence& agence );
    /** Destructeur.
      * Le destructeur n'a rien de spécial à faire.
      */
    virtual ~XmlInfoAgence();
    /** Opérateur d'affectation
      * Permet de copier une instance dans un autre.
      *
      * @param[in] agence instance de %XmlInfoAgence à copier.
      */
    XmlInfoAgence& operator=( const XmlInfoAgence& contrat );
    /** Permet de construire une instance à partir d'un nom de fichier
      * et d'information récupérées depuis le fichier XML.
      *
      * @param[in] nomFichier nom du fichier XML.
      * @param[in] infos pointeur sur la structure de données contentant
      * les informations nécessaires.
      *
      * @return une instance de @c XmlInfoAgence qui est vide si une erreur
      * se produit lors de la lecture des informations.
      */
    static XmlInfoAgence creeInstance( const QString& nomFichier,
                                       const QHash< QString, QString >* infos );
    /** Permet d'afficher les informations contenues dans un flot de sortie.
      * Est utilisé lors de la phase de debug.
      */
    void afficheInstance() const;
    /** Permet d'accéder à NbrJours.
      *
      * @return une référence constante sur NbrJours.
      */
    const unsigned& nbrJours() const;
    /** Permet de changer la valeur de NbrJours.
      *
      * @param nbrJours nouvelle valeur de NbrJours.
      */
    void setNbrJours( const unsigned& nbrJours );
    /** Permet d'accéder à Niveau.
      *
      * @return une référence constante sur Niveau.
      */
    const unsigned& niveau() const;
    /** Permet de changer la valeur de Niveau.
      *
      * @param niveau nouvelle valeur de Niveau.
      */
    void setNiveau( const unsigned& niveau );
    /** Permet d'accéder à Score.
      *
      * @return une référence constante sur Score.
      */
    const unsigned& score() const;
    /** Permet de changer la valeur de Score.
      *
      * @param score nouvelle valeur de Score.
      */
    void setScore( const unsigned& score );
    /** Permet d'accéder à Reputation.
      *
      * @return une référence constante sur Reputation.
      */
    const unsigned& reputation() const;
    /** Permet de changer la valeur de Reputation.
      *
      * @param reputation nouvelle valeur de Reputation.
      */
    void setReputation( const unsigned& reputation );
    /** Permet d'accéder à NbrPortails.
      *
      * @return une référence constante sur NbrPortails.
      */
    const unsigned& nbrPortails() const;
    /** Permet de changer la valeur de NbrPortails.
      *
      * @param nbrPortails nouvelle valeur de NbrPortails.
      */
    void setNbrPortails( const unsigned& nbrPortails );
    /** Permet d'accéder à NbrVilles.
      *
      * @return une référence constante sur NbrVilles.
      */
    const unsigned& nbrVilles() const;
    /** Permet de changer la valeur de NbrVilles.
      *
      * @param nbrVilles nouvelle valeur de NbrVilles.
      */
    void setNbrVilles( const unsigned& nbrVilles );
    /** Permet d'accéder à NbrMonstres.
      *
      * @return une référence constante sur NbrMonstres.
      */
    const unsigned& nbrMonstres() const;
    /** Permet de changer la valeur de NbrMonstres.
      *
      * @param nbrMonstres nouvelle valeur de NbrMonstres.
      */
    void setNbrMonstres( const unsigned& nbrMonstres );
    /** Permet d'accéder à NbrMaxMonstres.
      *
      * @return une référence constante sur NbrMaxMonstres.
      */
    const unsigned& nbrMaxMonstres() const;
    /** Permet de changer la valeur de NbrMaxMonstres.
      *
      * @param nbrMaxMonstres nouvelle valeur de NbrMaxMonstres.
      */
    void setNbrMaxMonstres( const unsigned& nbrMaxMonstres );
    /** Permet d'accéder à NbrEffrayes.
      *
      * @return une référence constante sur NbrEffrayes.
      */
    const unsigned& nbrEffrayes() const;
    /** Permet de changer la valeur de NbrEffrayes.
      *
      * @param nbrEffrayes nouvelle valeur de NbrEffrayes.
      */
    void setNbrEffrayes( const unsigned& nbrEffrayes );
    /** Permet d'accéder à NbrDevores.
      *
      * @return une référence constante sur NbrDevores.
      */
    const unsigned& nbrDevores() const;
    /** Permet de changer la valeur de NbrDevores.
      *
      * @param nbrDevores nouvelle valeur de NbrDevores.
      */
    void setNbrDevores( const unsigned& nbrDevores );
    /** Permet d'accéder à NbrAbordables.
      *
      * @return une référence constante sur NbrAbordables.
      */
    const unsigned& nbrAbordables() const;
    /** Permet de changer la valeur de NbrAbordables.
      *
      * @param nbrAbordables nouvelle valeur de NbrAbordables.
      */
    void setNbrAbordables( const unsigned& nbrAbordables );
    /** Permet d'accéder à NbrAbordablesRates.
      *
      * @return une référence constante sur NbrAbordablesRates.
      */
    const unsigned& nbrAbordablesRates() const;
    /** Permet de changer la valeur de NbrAbordablesRates.
      *
      * @param nbrAbordablesRates nouvelle valeur de NbrAbordablesRates.
      */
    void setNbrAbordablesRates( const unsigned& nbrAbordablesRates );
    /** Permet d'accéder à NbrNormaux.
      *
      * @return une référence constante sur NbrNormaux.
      */
    const unsigned& nbrNormaux() const;
    /** Permet de changer la valeur de NbrNormaux.
      *
      * @param nbrNormaux nouvelle valeur de NbrNormaux.
      */
    void setNbrNormaux( const unsigned& nbrNormaux );
    /** Permet d'accéder à NbrNormauxRates.
      *
      * @return une référence constante sur NbrNormauxRates.
      */
    const unsigned& nbrNormauxRates() const;
    /** Permet de changer la valeur de NbrNormauxRates.
      *
      * @param nbrNormauxRates nouvelle valeur de NbrNormauxRates.
      */
    void setNbrNormauxRates( const unsigned& nbrNormauxRates );
    /** Permet d'accéder à NbrDifficiles.
      *
      * @return une référence constante sur NbrDifficiles.
      */
    const unsigned& nbrDifficiles() const;
    /** Permet de changer la valeur de NbrDifficiles.
      *
      * @param nbrDifficiles nouvelle valeur de NbrDifficiles.
      */
    void setNbrDifficiles( const unsigned& nbrDifficiles );
    /** Permet d'accéder à NbrDifficilesRates.
      *
      * @return une référence constante sur NbrDifficilesRates.
      */
    const unsigned& nbrDifficilesRates() const;
    /** Permet de changer la valeur de NbrDifficilesRates.
      *
      * @param nbrDifficilesRates nouvelle valeur de NbrDifficilesRates.
      */
    void setNbrDifficilesRates( const unsigned& nbrDifficilesRates );
    /** Permet d'accéder à NbrMonstrueux.
      *
      * @return une référence constante sur NbrMonstrueux.
      */
    const unsigned& nbrMonstrueux() const;
    /** Permet de changer la valeur de NbrMonstrueux.
      *
      * @param nbrMonstrueux nouvelle valeur de NbrMonstrueux.
      */
    void setNbrMonstrueux( const unsigned& nbrMonstrueux );
    /** Permet d'accéder à NbrMonstrueuxRates.
      *
      * @return une référence constante sur NbrMonstrueuxRates.
      */
    const unsigned& nbrMonstrueuxRates() const;
    /** Permet de changer la valeur de NbrMonstrueuxRates.
      *
      * @param nbrMonstrueuxRates nouvelle valeur de NbrMonstrueuxRates.
      */
    void setNbrMonstrueuxRates( const unsigned& nbrMonstrueuxRates );
    /** Permet d'accéder à NbrInfernaux.
      *
      * @return une référence constante sur NbrInfernaux.
      */
    const unsigned& nbrInfernaux() const;
    /** Permet de changer la valeur de NbrInfernaux.
      *
      * @param nbrInfernaux nouvelle valeur de NbrInfernaux.
      */
    void setNbrInfernaux( const unsigned& nbrInfernaux );
    /** Permet d'accéder à NbrInfernauxRates.
      *
      * @return une référence constante sur NbrInfernauxRates.
      */
    const unsigned& nbrInfernauxRates() const;
    /** Permet de changer la valeur de NbrInfernauxRates.
      *
      * @param nbrInfernauxRates nouvelle valeur de NbrInfernauxRates.
      */
    void setNbrInfernauxRates( const unsigned& nbrInfernauxRates );
    /** Permet d'accéder à IdSyndicat.
      *
      * @return une référence constante sur IdSyndicat.
      */
    const unsigned& idSyndicat() const;
    /** Permet de changer la valeur de IdSyndicat.
      *
      * @param idSyndicat nouvelle valeur de IdSyndicat.
      */
    void setIdSyndicat( const unsigned& idSyndicat );
    /** Permet d'accéder à Syndicat.
      *
      * @return une référence constante sur Syndicat.
      */
    const QString& syndicat() const;
    /** Permet de changer la valeur de Syndicat.
      *
      * @param syndicat nouvelle valeur de Syndicat.
      */
    void setSyndicat( const QString& syndicat );
    /** Permet d'accéder à NbrMonsterCredits.
      *
      * @return une référence constante sur NbrMonsterCredits.
      */
    const unsigned& nbrMonsterCredits() const;
    /** Permet de changer la valeur de NbrMonsterCredits.
      *
      * @param nbrMonsterCredits nouvelle valeur de NbrMonsterCredits.
      */
    void setNbrMonsterCredits( const unsigned& nbrMonsterCredits );
    /** Permet d'accéder à NbrMailsNonLus.
      *
      * @return une référence constante sur NbrMailsNonLus.
      */
    const unsigned& nbrMailsNonLus() const;
    /** Permet de changer la valeur de NbrMailsNonLus.
      *
      * @param nbrMailsNonLus nouvelle valeur de NbrMailsNonLus.
      */
    void setNbrMailsNonLus( const unsigned& nbrMailsNonLus );
    /** Permet d'accéder à EmplacementBoite.
      *
      * @return une référence constante sur EmplacementBoite.
      */
    const QString& emplacementBoite() const;
    /** Permet de changer la valeur de EmplacementBoite.
      *
      * @param emplacementBoite nouvelle valeur de EmplacementBoite.
      */
    void setEmplacementBoite( const QString& emplacementBoite );
    /** Permet d'accéder à NiveauBoite.
      *
      * @return une référence constante sur NiveauBoite.
      */
    const double& niveauBoite() const;
    /** Permet de changer la valeur de NiveauBoite.
      *
      * @param niveauBoite nouvelle valeur de NiveauBoite.
      */
    void setNiveauBoite( const double& niveauBoite );
protected:
    /** Constructeur par défaut.
      * Utilisé dans creeInstance en cas d'erreur de lecture.
      */
    XmlInfoAgence();
    /** Nombre de jours d'existence de l'agence.
      */
    unsigned NbrJours;
    /** Niveau d'accréditation de l'agence.
      * Ce nombre détermine la compétence maximale des monstres pouvant être
      * embauchés.
      */
    unsigned Niveau;
    /** Score de l'agence, utilisé pour le classement des agence.
      */
    unsigned Score;
    /** Réputation de l'agence.
      */
    unsigned Reputation;
    /** Nombre de portails construits par l'agence.
      */
    unsigned NbrPortails;
    /** Nombre de villes contrôlées par l'agence.
      * De ce nombre dépend le nombre de contrats disponibles quotidiennement.
      */
    unsigned NbrVilles;
    /** Nombre de monstres actuellement employés par l'agence.
      */
    unsigned NbrMonstres;
    /** Nombre maximal de monstres pouvant être employés par l'agence.
      * Ce nombre peut être augmenté en effectuant des recherches au
      * laboratoire.
      */
    unsigned NbrMaxMonstres;
    /** Nombre d'enfants effrayés.
      */
    unsigned NbrEffrayes;
    /** Nombre d'enfants dévorés.
      */
    unsigned NbrDevores;
    /** Nombre de contrats abordables effectués.
      */
    unsigned NbrAbordables;
    /** Nombre de contrats abordables ratés.
      */
    unsigned NbrAbordablesRates;
    /** Nombre de contrats normaux effectués.
      */
    unsigned NbrNormaux;
    /** Nombre de contrats normaux ratés.
      */
    unsigned NbrNormauxRates;
    /** Nombre de contrats difficiles effectués.
      */
    unsigned NbrDifficiles;
    /** Nombre de contrats difficiles ratés.
      */
    unsigned NbrDifficilesRates;
    /** Nombre de contrats monstrueux effectués.
      */
    unsigned NbrMonstrueux;
    /** Nombre de contrats monstrueux ratés.
      */
    unsigned NbrMonstrueuxRates;
    /** Nombre de contrats infernaux effectués.
      */
    unsigned NbrInfernaux;
    /** Nombre de contrats infernaux ratés.
      */
    unsigned NbrInfernauxRates;
    /** Id du syndicat auquel appartient l'agence (vaut -1u si l'agence
      * n'appartient à aucun syndicat).
      */
    unsigned IdSyndicat;
    /** Nom du syndicat auquel appartien l'agence, si applicable.
      */
    QString Syndicat;
    /** Nombre de monstercrédits de l'agence.
      */
    unsigned NbrMonsterCredits;
    /** Nombre de mails non-lus dans la boîte au lettre.
      */
    unsigned NbrMailsNonLus;
    /** Nom de la ville sur laquelle se trouve la boîte à pet de l'agence.
      */
    QString EmplacementBoite;
    /** Niveau de la boîte à pet de l'agence, en \f$m^3\f$.
      */
    double NiveauBoite;
};


#endif // XMLINFOAGENCE_HPP
